#ifndef __BSW_LPI2C_H__
#define __BSW_LPI2C_H__



#define IIC_ACK_ON 		1
#define IIC_ACK_OFF 	0

typedef struct 
{
	LPI2C_Type*                      Lpi2c_Base;					/* IIC硬件模块选择:  LPI2C0     	*/
	clock_names_t                    ClockName;						/* IIC的PCC时钟选择: LPI2C0_CLK  	*/
	uint32_t                         u32_ClkSoc;					/* PCC时钟选择:      6 						*/

	
	bool                             b_MDebug;						/* 设置主机DEBUG模式  						*/
	bool                             b_MSet;							/* 设置主机打盹模式  							*/
	bool                             b_MSofRest;					/* 主机模式软件复位 							*/
	
	lpi2c_slave_addr_config_t        Lpi2c_SlvCon;				/* 匹配接收地址  									*/
	
	lpi2c_master_prescaler_t         Set_Mpres;						/* 设置IIC预分频系数   						*/
	lpi2c_pin_config_t               Set_MPinCfg;					/* 配置引脚模式 -开漏输出 				*/
  lpi2c_nack_config_t              Set_MNACKCfg;				/* 配置应答位 										*/
	
	bool                             b_MRxDMA;						/* 配置RXDMA 											*/
	bool                             b_MTxDMA;						/* 配置TXDMA 											*/
	
	bool                             b_MCirFIFO;					/* 配置循环存储设置   						*/
	lpi2c_rx_data_match_t            Set_MRxDataMatch;		/* 配置主机接收存储   						*/
	lpi2c_timeout_config_t           Set_MTimeoutCfg;			/* 配置通信超时标志 					 		*/
	bool                             b_MAutoStopCfg;			/* 配置自动停止  */
	
	uint8_t                          u8_MSDAG;						/* 设置SDA数字滤波器  						*/
	uint8_t                          u8_MSCLG;						/* 设置SCL数字滤波器 							*/
	uint16_t                         u16_MBusIdle;				/* 设置BUS总线空闲超时标志     		*/ 
	uint32_t                         u32_MPinLow;					/* 设置总线低电平超时标志    			*/
	
	uint8_t                          u8_MDataValid;
	uint8_t                          u8_MSetupHold;
	uint8_t                          u8_MClockHigh;				/*配置高电平持续的周期个数				*/
	uint8_t                          u8_MClockLow;				/*配置低电平持续的周期个数				*/
	
	uint16_t                         u16_MRxFIFO;
	uint16_t                         u16_MTxFIFO;
}BSW_LPI2C_Cfg;



#define LPI2C_MCR_REG(base)                      ((base)->MCR)
#define LPI2C_MSR_REG(base)                      ((base)->MSR)

#define LPI2C_RD_MSR(base)       			(LPI2C_MSR_REG(base))
#define LPI2C_WR_MSR(base, value) 		(LPI2C_MSR_REG(base) = (value))

#define LPI2C_MFCR_REG(base)                     ((base)->MFCR)
#define LPI2C_RD_MFCR(base)      (LPI2C_MFCR_REG(base))
#define LPI2C_WR_MFCR(base, value) (LPI2C_MFCR_REG(base) = (value))



typedef enum _lpi2c_master_status {
    kLpi2cMasterTxRequestFlag       = LPI2C_MSR_TDF_SHIFT,  /*!< Transmit data flag*/  
    kLpi2cMasterRxReadyFlag         = LPI2C_MSR_RDF_SHIFT,  /*!< Receive data flag*/   
    kLpi2cMasterEndOfPacketFlag     = LPI2C_MSR_EPF_SHIFT,  /*!< End Packet flag*/ 
    kLpi2cMasterStopDetectFlag      = LPI2C_MSR_SDF_SHIFT,  /*!< Stop detect flag*/ 
    kLpi2cMasterNackDetectFlag      = LPI2C_MSR_NDF_SHIFT,  /*!< NACK detect flag*/ 
    kLpi2cMasterArbitrationLostFlag = LPI2C_MSR_ALF_SHIFT,  /*!< Arbitration lost flag*/ 
    kLpi2cMasterFifoErrFlag         = LPI2C_MSR_FEF_SHIFT,  /*!< FIFO error flag*/ 
    kLpi2cMasterPinLowTimeoutFlag   = LPI2C_MSR_PLTF_SHIFT, /*!< Pin low timeout flag*/ 
    kLpi2cMasterDataMatchFlag       = LPI2C_MSR_DMF_SHIFT,  /*!< Data match flag*/ 
    kLpi2cMasterBusyFlag            = LPI2C_MSR_MBF_SHIFT,  /*!< Master busy flag. */
    kLpi2cMasterBusBusyFlag         = LPI2C_MSR_BBF_SHIFT   /*!< Bus busy flag. */
} lpi2c_master_status_t;


bool LPI2C_HAL_MasterGetStatus(LPI2C_Type * base, lpi2c_master_status_t statusFlag);
void LPI2C_HAL_MasterClearStatus(LPI2C_Type * base, lpi2c_master_status_t statusFlag);

/********************************************************
**函数名：	BSW_LPI2C_INIT
**功能：		初始化 LPI2C_INIT
**输入参数	Lp2c_Cfg	IIC配置结构体
**返回值：	无
**注意：		根据相应的电路配置IIC
*********************************************************/
void BSW_LPI2C_INIT(BSW_LPI2C_Cfg Lpi2c_Cfg);





/*******************************************************
 * 函数名：BSW_LPI2C_ByteWrite
 * 描述  ：写一个字节到I2C设备寄存器中
 * 输入  ：IIC_Addr 8bit从机地址 
 * 输入  ：REG_Address 接收数据的IIC设备寄存器的地址 
 * 输入  ：REG_data 待写入的数据
 * 输出  : 无
 * 调用  ：外部调用	 
********************************************************/
void BSW_LPI2C_ByteWrite(uint8_t IIC_Addr,uint8_t REG_Address,uint8_t REG_data);








/*******************************************************
 * 函数名：BSW_LPI2C_ByteRead
 * 描述  ：从IIC设备寄存器中读取一个长度为uint8_t_Rx_Lenth的数组
 * 输入  ：IIC_Addr 8bit从机地址 
 * 输入  ：REG_Address 接收数据的IIC设备寄存器的地址 
 * 输入  ：长度为uint8_t_Rx_Lenth组uint8_t_Reve_Buff
 * 输出  : 无
 * 调用  ：外部调用	 
********************************************************/
uint16_t BSW_LPI2C_ByteRead(uint8_t IIC_Addr,uint8_t REG_Address);

#endif
